#1.路由/routing
from flask import Flask
app=Flask(__name__)
@app.route('/')
def home():
    return 'Welcome to the Home Page.'
@app.route('/about')
def about():
    return  "This is the About Page"

#2.视图函数（view funcitons）
#视图函数是处理请求并返回响应的python函数，他们通常接受请求对象，并返回相应对象，或者字符串，HTML等内容
from flask import request

@app.route('/greet/<name>')
def greet(name):
    return f'hello,{name}'

#3.请求对象
#请求对象包含了客户端发送的信息，包括请求方法，URL，请求头，表单数据等。flask提供了request对象来访问这些信息
from flask import request
@app.route('/submit',methods=['POST'])
def submit():
    username=request.form.get('username')
    return f'hellow,{username}'

#4.相应对象（request object）
#相应对象包含了反送给客户端的信息，包括状态码、响应头和响应体，Flask默认会将字符串，HTML直接作为响应体
from flask import make_response
@app.route('/custom_response')
def custom_response():
    response=make_response('this is a custom response!')
    response.headers['X-Custom-Header']='Value'
    return response

#5.模板（templates）
#flask使用jinja2模板引擎来渲染html模板，模允许将python代码嵌入到html中，从而动态生成网页内容
from flask import render_template
@app.route('/hello/<name>')
def hello(name):
    return render_template('hello.html',name=name)

#6.应用工厂（application Factory）
#应用工厂是一个python函数，用于船舰和配置Flask应用实例，这种方法允许你创建多个应用实例
#或者在不同配置下初始化应用
from flask import Flask
def create_app(config_name):
    app=Flask(__name__)
    app.config.from_object(config_name)

    from . import routes
    app.register_blueprint(routes.bp)
    return app

#7.配置对象（configuration objects）
#配置对象用来设置应用的各种配置选项，如数据库连接字符串、调试模式等。可以铜鼓哦直接设置或加载配置文件来配置flask应用
class config:
    DEBUG=True
    SECRET_KEY='mysecretkey'
    SQLALCHEMY_DATABSE_URI='sqlite:///mydatabase.db'
#app.config.from_object(Config):将Config类中的配置项加载到应用配置中

#8.蓝图（Blueprints）
#蓝图是Flask中的组织代码的方式，它允许你将相关的视图函数，模板和静态文件组织在一起，并且可以在多个应用中重用
from flask import Blueprint
bp=Blueprint('main',__name__)

@bp.route('/')
def home():
    return 'home page'

#注册蓝图（app/__init__.py）

from flask import Flask
# 注释掉相对导入，因为这是示例代码
# from .routes import bp as main_bp

def create_app():
    app= Flask(__name__)
    # app.register_blueprint(main_bp)  # 注释掉，因为main_bp未定义
    return app

#9.静态文件（static files）
#静态文件是不会被服务器执行的文件，如css,javascript和图片文件。
#flask提供了一个简单的方法来服务这些文件。
#访问静态文件实力
#<link rel='stylesheet' type='text/css' href='{{url_for('static',filename='style.css')}}'>
#静态文件目录： 将静态文件放在static文件夹中，Flask会自动提供服务

#10.扩展（Extensions）
#Flask有许多扩展，可以额外添加的功能，如数据库集成，表单验证，用户认证等，这些扩展提供了更高级的功能和第三方集成。
from flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///mydatabase.db'
db=SQLAlchemy(app)
#SQLAlchemy:用于数据库集成的扩展

#11.会话（Sessions）
#flask使用客户端绘画来存储用户信息，以便在用户浏览应用时候记住他们的状态。
#会话数据存储在客户端的cookie中，并在服务器端进行签名和加密
from flask import session 
#自动生成的密钥
app.secret_key='your_secret_key_here'
@app.route('/set_seesion/<usernaeme>')
def set_session(username):
    session['username']=username
    return f'Session set for {username}'

@app.route('/get_session')
def get_session():
    username=session.get('username')
    return f'Hello,{username}!' if username else 'No session data'
#session对象用于存取会话数据
#可以用python内置的secrets模块生成一个强随即性的密钥
#python -c 'import secrets; print(secrets.token_hex())'

#12.错误处理（Error Handling）
#flask允许你定义错误处理函数，当特定的错误发生时，这些函数会被调用。
#可以自定义错误页面或处理逻辑
@app.errorhandler(404)
def page_out_found(e):
    return 'Page not found',404

@app.errorhandler(500)
def internal_server_error(e):
    return 'Internal server error',500
#@app.errirhandler(404):定义404错误的处理函数，返回自定义错误界面

# 添加运行部分
if __name__ == '__main__':
    app.run(debug=True)

